{
    "cells": [
        {
            "cell_type": "markdown",
            "id": "c4c59ec3",
            "metadata": {},
            "source": [
                "# Heatmap Example"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 1,
            "id": "f01d7352-fadb-48c3-a124-77c56a6ac0df",
            "metadata": {},
            "outputs": [],
            "source": [
                "%load_ext autoreload\n",
                "%autoreload 2\n",
                "\n",
                "import matplotlib.pyplot as plt\n",
                "import numpy as np\n",
                "import pandas as pd\n",
                "from matplotlib.colors import LinearSegmentedColormap\n",
                "\n",
                "from plottable import ColDef, Table"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 2,
            "id": "a381419c-1c73-4ce5-8a8c-9a5e5c368d79",
            "metadata": {},
            "outputs": [],
            "source": [
                "cmap = LinearSegmentedColormap.from_list(\n",
                "    name=\"BuYl\", colors=[\"#01a6ff\", \"#eafedb\", \"#fffdbb\", \"#ffc834\"], N=256\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 3,
            "id": "91651fe1-22e6-4671-981c-fd17816c5771",
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "image/png": "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rT//+c+KiIiQJEVERCgkJCTbuUaMGKFSpUppyJAhTst8fX1Nl9Fkx8/PT4mJiU798fHxkqQSJUpY3q+vvvpKZcuWVYsWLRz7tWbNGqf59+3bp6SkJEfr27dvtvMVLVpU48aNk6+v720FMQAAAAAAwJlbhCjp6en69ttvHZe+dO3a1XQWSrdu3RQbG6utW7dKkpYvX67AwEA1bNjQaa74+HiNGDFCw4cP10MPPeS0HV9f35vWkpKSolKlSjn1+/v7S1KuIcz1Tp06pW3btqlr164qWrSonn766Wwv5enQoYPq1avnaDeOuT5g6d27t7p06aLz589brgMAAAAAAOTOLUIU6dqlL0899ZRatmypqlWrOl3KExAQoNTUVKWmpsput8vT0zPHG8zOmjVLR44c0cSJE0390dHR2d5L5IknntDAgQMlXbtsp3r16k5jbDab4uPjFR8fr7S0NElyumTIx8fHsez6/erSpYs6dOggLy8v01N5rq/r6NGjjnZjUJMVrgwbNkze3t6O+7cAAAAAAIA7x21ClO+//16ZmZn65JNP9Pvvv+vgwYOSpPLlyys4OFjdunUzna0xYsQI9ejRI9u5rl69qjfeeEMhISF65JFHTNto0KCBatasaRo/cOBAPf7445KklStXqm3btk5nsYSFhWnVqlWSrj0tJyEhQfXq1TONqV+/vqPuLF999ZUqV66sDz74QD/++GO2lwrlJitcmTx5sk6fPq0RI0bkeQ4AAAAAAHBzbhOipKWl6dtvv1VQUJDpLJTu3bvr9OnT+uabbxQVFeVos2fPVoUKFfTEE09kO9/mzZu1aNEiPfDAA46+3bt368svv9SiRYvUtGlTBQYGavDgwerUqZPGjRsnSfrxxx8VGRmpr7/+Ws2aNVPVqlU1YsQItWvXTh988IFjrilTpmjixInq2LGjqlatqtDQUL3zzjuaMGGCqY6TJ09q69atTvt1vbJly6p8+fKmlnUz2utdvXpVb775pl577TVVqVLF8rEFAAAAAAC5c5sQRZIjZLg+bAgJCdHy5cudxp49e1Y//fRTjpf0SNLbb7+t5ORkU1/fvn21du1affPNN9q1a5e6deump59+Wrt27XKM6datm3766SdFRERo7969atWqlf70pz/pyJEjjjGjR4/WjBkz9H//9386ePCghg8frkGDBmnhwoXZ7tfly5ez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YAEhCgAAAAAAgAWEKAAAAAAAABYQogAAAAAAAFhAiAIAAAAAAGABIQoAAAAAAIAFhCgAAAAAAAAWEKL8f0888YQ2btyo5ORk2e12DR8+XB4eHgoODpZhGDm28PBw2e32HJevW7fOtJ0HH3xQV65cUb9+/Uz9ISEhio+PN/U9++yzysjIkJ+fn6Ovbdu2ysjIULFixUxj9+/fr//85z93+KgAAAAAAIAshCiSGjdurNWrV2vZsmUKCgpS37591bt3b02dOlVbtmxRQECAAgIC1LhxY8f4rL7Fixebft6yZYsmTpzo+Llr166mbfXo0UOSFBoaaurftm2bSpYsqRo1ajj6WrduLS8vLz3xxBOmWn///XddunTJ0Ve3bl3VrFlTnTp1UpEiRe748QEAAAAAAIQokqTx48fr888/19SpUxUdHa1169bp+eefV//+/VW5cmXFxMQoJiZG586dkySdO3fO0ZeWlqbz5887fr58+bKSk5MdP994dklISIimTZumVq1aqVy5co7+48ePKzY21hHUSNdClCNHjig4ONjR16hRI23dutVpzhUrVujChQvq2LHj3ThEAAAAAAAUeAU+RClZsqRatGihuXPnmvp37dqlffv23dFQonLlymratKkmTZqkvXv3qnv37qbl27ZtU6NGjSRJDzzwgOrUqaMpU6Y4hSjbtm0zrRcSEqKIiAgtX77c6QwXAAAAAABwZxT4EKVq1aoqVKiQjh075rTMbrerWrVqd2xboaGh2rlzp06dOqWIiAinwGPr1q2OM1FatWql33//XUuXLlXDhg1VrFgxlStXTpUqVTKdidKkSRNVrFhRK1euVEREhDp06KDixYvfsZoBAAAAAMA1BT5Eybppa1JSktOy+Ph4lShR4o5tK+uMEUmKiIhQ8+bNVbFiRcfybdu2qX79+vL09FTr1q21du1axcbG6vDhw2revLkaNWqkixcv6uDBg6Y5161bp4SEBG3ZskUJCQnq3LnzHasZAAAAAABcU+BDlJSUFEnXLuu5kb+/f7bhyq2oUaOGGjRo4AhRDhw4oEOHDikkJMQx5pdfflHRokVVp04dtW7dWpGRkZKkdevWKTg4WI0aNdL27dtN8/bo0cMxp2EY+uabb7ikBwAAAACAu6DAhyjR0dG6evWqqlev7rTMZrPJbrffke1kBRt79uxRamqqUlNTVaNGDVPgkZiYqIMHD6pjx44KDAzUxo0bJf0vRGnQoIHpUp4WLVqoYsWKmjZtmmPOfv366amnnso2FAIAAAAAALeuwIco58+f19atW9WnTx9Tf506dVS3bl2tWrXqjmwnJCREH330kerVq+do7du3V6NGjRQYGOgYt3XrVvXq1Uvbt293nCWzYcMGNWjQQHXq1DGFKCEhIYqMjFTdunUdcz766KOKi4tTt27d7kjdAAAAAADgmgIfokjS0KFD1adPHw0ZMkQ2m00tWrTQokWL9Nlnn+nw4cO3Pf8jjzyioKAgzZ49W1FRUY72448/6sCBA6azUbZt26agoCDHpTySdOHCBR05ckQ1atRwPJnH09NTzz33nL788kvTnFFRUTylBwAAAACAu4AQRdJPP/2kjh07qmvXrtq/f7/mz5+vZcuW6bXXXrsj84eEhGjPnj3ZPgFo6dKlTiGKJK1du9Y0bt26dTp8+LDi4uIkSa1bt1aZMmX0zTffZDtnq1atVK5cuTtSPwAAAAAAkDwMwzDytIKHx92qBfeBOt+lu7oEt/bvFmdcXYJbC/S9MzdyLqi8lOHqEtxa8fQ7cw+sAiv5uKsrcH8XD7i6AvdWsb2rK3BrGT7849vtSPXwc3UJbu37M2VdXYJbG7XnAVeX4Nb2tffJ03jORAEAAAAAALCAEAUAAAAAAMACQhQAAAAAAAALCFEAAAAAAAAsIEQBAAAAAACwgBAFAAAAAADAAkIUAAAAAAAACwhRAAAAAAAALCBEAQAAAAAAsIAQBQAAAAAAwAJCFAAAAAAAAAsIUQAAAAAAACzwcnUBuL8El7/k6hLc2pbYoq4uwa1Vr5ro6hJQkGWmuboC95Zkd3UF7q/UI66uwK1d9Snl6hLcWoYKu7oEtxZ3xc/VJbi16iUyXF0CYBlnogAAAAAAAFhAiAIAAAAAAGABIQoAAAAAAIAFhCgAAAAAAAAWEKIAAAAAAABYQIgCAAAAAABgASEKAAAAAACABYQoAAAAAAAAFhCiAAAAAAAAWECIAgAAAAAAYEG+CFHsdruSk5Pl6+ub43LDMBw/BwUF6bvvvlNCQoJOnz6tiRMnqnDhwo7l4eHhysjI0KOPPmqax2azyTAM2Ww2hYeHyzCMHFtwcLCCg4NNfefOndPKlStVo0YNx5zr1q3Ldv2//e1vpm03bdpUhmGoTZs22e5feHj4LR07AAAAAABgTb4IUSTJ19dXXbt2depv2bKlqlSp4vjZZrNp48aN+vXXX1W/fn116dJFzZs315IlS0zreXl5adq0aTlub/HixQoICFBAQIBju1k/BwQEaMuWLY6xWX3BwcG6ePGiIiMjVbRoUcfyiRMnmtYNCAjQvHnzTNsLDQ1VZmamQkND83RcAAAAAADAnZFvQpTDhw8rLCzMqT8sLExRUVGOn//xj39o48aNGjFihI4dO6bt27erS5cuateunVq1auUYl5ycrObNm6tHjx7Zbi8tLU0xMTGKiYlRXFycJDl+jomJUUZGhmNsVt/+/fvVr18/FStWTB07djRt6/p1Y2JilJaW5lju4eGh7t27a9q0aeratau8vLxu+TgBAAAAAIBbk29ClIULF6p169YKCAhw9Pn4+Oi5557TggULHH3PPPOM5s6da1o3JiZGP/zwgzp16uToO3/+vKZNm6YJEyaYzhq5XZcvX9bRo0dVtWpVy+u0aNFC/v7+eu+993TlyhW1a9fujtUDAAAAAACsyTchit1u1/bt29WzZ09H3zPPPKPExERt2rRJklSqVCmVKVNGx44dy3b9atWqmfpGjRolb29vDR8+/I7V6enpqUqVKunChQuW1wkNDdX333+vlJQUrVixgkt6AAAAAABwgXwTokjS/PnzTZf0hIWFaeHChY6byvr5+UmSEhMTndaNj49XiRIlTH1JSUl65513NGTIENN9VW5V0aJFNW7cOPn6+mrFihWO/uHDhyspKcnR1q5d61jm6empbt26KSIiQpIUERGhTp06qUiRIrddDwAAAAAAsC5fhShLlixRUFCQ6tSpo1KlSql9+/amS3lSUlIkXTsj5Ub+/v5KSkpy6v/3v/+t3bt3a/Lkybdc1/UBSe/evdWlSxedP3/esfxf//qX6tWr52i9e/d2LGvTpo1KlCihVatWSZIiIyNlGIbpnioAAAAAAODuy1chSlxcnFavXq1evXopJCREBw4c0L59+0zLExISVL16dad1bTab7HZ7tvMOGDBAnTp1uuV7kWSFI8OGDZO3t7d2797tVPfRo0cd7fTp045loaGh8vHxUWxsrFJTU5WYmCg/Pz8u6QEAAAAA4B7LVyGKdO2Snp49e6pXr16aP3++aZlhGFq1apX69Olj6i9durSefvpprVy5Mts5d+zYoS+++EJjxoy5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",
                        "text/plain": [
                            "<Figure size 1400x500 with 1 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "cities = [\n",
                "    \"TORONTO\",\n",
                "    \"VANCOUVER\",\n",
                "    \"HALIFAX\",\n",
                "    \"CALGARY\",\n",
                "    \"OTTAWA\",\n",
                "    \"MONTREAL\",\n",
                "    \"WINNIPEG\",\n",
                "    \"EDMONTON\",\n",
                "    \"LONDON\",\n",
                "    \"ST. JONES\",\n",
                "]\n",
                "months = [\n",
                "    \"JAN\",\n",
                "    \"FEB\",\n",
                "    \"MAR\",\n",
                "    \"APR\",\n",
                "    \"MAY\",\n",
                "    \"JUN\",\n",
                "    \"JUL\",\n",
                "    \"AUG\",\n",
                "    \"SEP\",\n",
                "    \"OCT\",\n",
                "    \"NOV\",\n",
                "    \"DEC\",\n",
                "]\n",
                "\n",
                "data = np.random.random((10, 12)) + np.abs(np.arange(12) - 5.5)\n",
                "data = (1 - data / (np.max(data)))\n",
                "\n",
                "\n",
                "d = pd.DataFrame(data, columns=months, index=cities).round(2)\n",
                "\n",
                "fig, ax = plt.subplots(figsize=(14, 5))\n",
                "\n",
                "\n",
                "column_definitions = [\n",
                "    ColDef(name, cmap=cmap, formatter=lambda x: \"\") for name in months\n",
                "] + [ColDef(\"index\", title=\"\", width=1.5, textprops={\"ha\": \"right\"})]\n",
                "\n",
                "tab = Table(\n",
                "    d,\n",
                "    column_definitions=column_definitions,\n",
                "    row_dividers=False,\n",
                "    col_label_divider=False,\n",
                "    textprops={\"ha\": \"center\", \"fontname\": \"Roboto\"},\n",
                "    cell_kw={\n",
                "        \"edgecolor\": \"w\",\n",
                "        \"linewidth\": 0,\n",
                "    },\n",
                ")\n",
                "\n",
                "\n",
                "tab.col_label_row.set_facecolor(\"k\")\n",
                "tab.col_label_row.set_fontcolor(\"w\")\n",
                "tab.columns[\"index\"].set_facecolor(\"k\")\n",
                "tab.columns[\"index\"].set_fontcolor(\"w\")\n",
                "tab.columns[\"index\"].set_linewidth(0)\n",
                "\n",
                "\n",
                "plt.show()\n",
                "\n",
                "\n",
                "fig.savefig(\"images/calender.png\", dpi=200)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "id": "70cdae3a-37ca-418a-849c-5d29c4b7b9da",
            "metadata": {},
            "outputs": [],
            "source": []
        }
    ],
    "metadata": {
        "kernelspec": {
            "display_name": "Python 3.10.5 ('env': venv)",
            "language": "python",
            "name": "python3"
        },
        "language_info": {
            "codemirror_mode": {
                "name": "ipython",
                "version": 3
            },
            "file_extension": ".py",
            "mimetype": "text/x-python",
            "name": "python",
            "nbconvert_exporter": "python",
            "pygments_lexer": "ipython3",
            "version": "3.10.5"
        },
        "vscode": {
            "interpreter": {
                "hash": "fad163352f6b6c4f05b9b8d41b1f28c58b235e61ec56c8581176f01128143b49"
            }
        }
    },
    "nbformat": 4,
    "nbformat_minor": 5
}
